home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / lang_c / bldfuncs / bldfuncs.c < prev    next >
Text File  |  1989-04-28  |  6KB  |  304 lines

  1.  
  2. /*Last revision : Friday April 28, 1989 at 10:21 pm*/
  3.  
  4.  
  5. #include <stdio.h>
  6. #include <ctype.h>
  7. #include <string.h>
  8. #define LINT_ARGS
  9.  
  10. #define TRUE  1
  11. #define FALSE 0
  12. #define OK    0
  13. #define ERROR 1
  14.  
  15. #define BRACES -2
  16. #define PARENS -3
  17. #define QUOTES -4
  18.  
  19. char *get_fn_name(char *);
  20. int get_names_one_file(char *,FILE *);
  21.  
  22. main (argc,argv)
  23. int argc;
  24. char **argv;
  25.  
  26. {
  27.    FILE *fp_out;
  28.    char *current_file;
  29.    int num_files, i;
  30.  
  31.    if (argc < 2)
  32.       {
  33.       fprintf(stderr, "Wrong number of parameters");
  34.       exit(1);
  35.       }
  36.    if ((fp_out = fopen("funcs.txt", "w")) == NULL)
  37.       {
  38.       fprintf(stderr,"can't open %s\n","funcs.txt");
  39.       exit(1);
  40.       }
  41.    printf("Creating funcs.txt...\n");
  42.    num_files = argc-1;
  43.    for (i=1;i<=num_files;i++)
  44.       {
  45.       printf("%30s: %3d of %3d files\n",
  46.          current_file = strlwr(*++argv),i,num_files);
  47.       if (get_names_one_file(current_file,fp_out) != OK)
  48.          {
  49.          fprintf(stderr,"can't process %s",current_file);
  50.          exit(1);
  51.          }
  52.       }
  53.    fclose(fp_out);
  54.    exit(0);
  55. }
  56.  
  57. int get_names_one_file(source_file_name,fp_out)
  58. char *source_file_name;
  59. FILE *fp_out;
  60.  
  61. {
  62.    int line_len,c,got_fn_defn = FALSE;
  63.    #define LINE_LEN 8192
  64.    char line[LINE_LEN], *name_ptr,fn_name[64];
  65.    FILE *fp_source;
  66.  
  67.    if ((fp_source = fopen(source_file_name, "r")) == NULL)
  68.       return ERROR;
  69.    sprintf(line, "\n%s:", source_file_name);
  70.    fprintf(fp_out,line);
  71.  
  72.    while (TRUE)
  73.       {
  74.       line_len = 0;
  75.       while ((c=filter_data(fp_source)) != EOF && c != ';' && c != PARENS)
  76.          line[line_len++] = c;
  77.       if (c == EOF)
  78.          break;
  79.       if (c == ';')
  80.          continue;
  81.       line[line_len] = 0;
  82.          strcpy(fn_name,get_fn_name(line));
  83.       if (!fn_name[0])
  84.          continue;
  85.       while ((c=filter_data(fp_source)) != EOF && isspace(c))
  86.          ;
  87.       if (c==';' || c==',')
  88.          continue;
  89.       if (c==EOF)
  90.          break;
  91.       while (c != BRACES && c!=EOF)
  92.          c=filter_data(fp_source);
  93.       fprintf(fp_out,"\n\t%s",fn_name);
  94.       got_fn_defn = TRUE;
  95.       }
  96.    fclose(fp_source);
  97.    fputs(got_fn_defn ? ";\n" : "\n\t;\n",fp_out);
  98.    return OK;
  99. }
  100.  
  101.  
  102. char *
  103. get_fn_name(line)
  104. char *line;
  105. {
  106.    char *name_ptr;
  107.    int len;
  108.  
  109.    if (!(len = strlen(line)))
  110.       return line;
  111.    name_ptr = line + len -1;
  112.    while (isspace(*name_ptr))
  113.       name_ptr--;
  114.    *(name_ptr + 1)=0;
  115.    while ((isalnum(*name_ptr) || *name_ptr=='_') && name_ptr>=line)
  116.       name_ptr--;
  117.    if (isdigit(*++name_ptr))
  118.       return(name_ptr + strlen(name_ptr));
  119.    return name_ptr;
  120. }
  121.  
  122. int filter_data(fp_source)
  123. FILE *fp_source;
  124. {
  125.    int c;
  126.  
  127.    if ((c=filter_parens(fp_source)) != '=')
  128.       return c;
  129.    while ((c=filter_parens(fp_source)) != ';' && c != EOF)
  130.       ;
  131.    return c;
  132. }
  133.  
  134. int filter_parens(fp_source)
  135. FILE *fp_source;
  136. {
  137.    int paren_cnt, c;
  138.  
  139.    if ((c=filter_curly_braces(fp_source)) != '(')
  140.       return c;
  141.    paren_cnt = 1;
  142.    while (paren_cnt)
  143.       switch (filter_curly_braces(fp_source))
  144.          {
  145.          case ')':
  146.             paren_cnt--;
  147.             break;
  148.          case '(':
  149.             paren_cnt++;
  150.             break;
  151.          case EOF:
  152.             return EOF;
  153.          }
  154.       return PARENS;
  155. }
  156.  
  157.  
  158. int filter_curly_braces(fp_source)
  159. FILE *fp_source;
  160. {
  161.    int brace_cnt, c;
  162.  
  163.    if ((c=filter_ppdir(fp_source)) != '{')
  164.       return c;
  165.    brace_cnt = 1;
  166.    while (brace_cnt)
  167.       switch (filter_ppdir(fp_source))
  168.          {
  169.          case '}':
  170.             brace_cnt--;
  171.             break;
  172.          case '{':
  173.             brace_cnt++;
  174.             break;
  175.          case EOF:
  176.             return EOF;
  177.          }
  178.       return BRACES;
  179. }
  180.  
  181. #define MAXLINE 1024
  182. int filter_ppdir(fp_source)
  183. FILE *fp_source;
  184. {
  185.    int c,i;
  186.    char line[MAXLINE + 1];
  187.  
  188.    while (TRUE)
  189.       {
  190.       if ((c=filter_quotes(fp_source)) != '#')
  191.          return c;
  192.       if ((c=get_ppdir_line(fp_source,line)) == EOF)
  193.          return EOF;
  194.       if (strncmp(line,"define",6))
  195.          continue;
  196.       if (line[strlen(line) - 1] != '\\')
  197.          continue;
  198.       else
  199.          while (TRUE)
  200.             {
  201.             if ((c=get_ppdir_line(fp_source)) == EOF)
  202.                return EOF;
  203.             if (line[strlen(line) -1] != '\\')
  204.                break;
  205.             }
  206.       }
  207. }
  208.  
  209. int get_ppdir_line(fp_source,line)
  210. FILE *fp_source;
  211. char *line;
  212.  
  213. {
  214.    int i,c;
  215.    
  216.    for (i=0;i<MAXLINE && (c=filter_quotes(fp_source)) != '\n' && c != EOF;i++)
  217.       line[i] = c;
  218.    line[i] = 0;
  219.    if (c==EOF)
  220.       return EOF;
  221.    return '\n';
  222. }
  223.  
  224.  
  225. int filter_quotes(fp_source)
  226. FILE *fp_source;
  227. {
  228.    int c1, c2;
  229.    
  230.    if ((c1 = filter_cmt(fp_source)) != '\'' && c1 != '"')
  231.       return c1;
  232.    while (TRUE)
  233.       switch (c2 = filter_cmt(fp_source))
  234.          {
  235.          case '\\':
  236.             filter_cmt(fp_source);
  237.             break;
  238.          case EOF:
  239.             return EOF;
  240.          default:
  241.             if (c2 == c1)
  242.                return QUOTES;
  243.          }
  244. }
  245.  
  246. int filter_cmt(fp_source)
  247. FILE *fp_source;
  248. {
  249.    #define STABLE       0
  250.    #define IN_CMT_FS    1
  251.    #define OUT_CMT_STAR 2
  252.  
  253.    int c, state=STABLE, cmt_level=0;
  254.  
  255.    while (TRUE)
  256.       {
  257.       c=fgetc(fp_source);
  258.       if (c==EOF)
  259.          return EOF;
  260.       switch (state)
  261.          {
  262.          case STABLE:
  263.             if (c=='*')
  264.                state=OUT_CMT_STAR;
  265.             else if (c=='/')
  266.                state= IN_CMT_FS;
  267.             break;
  268.          case IN_CMT_FS:
  269.             if (c=='*')
  270.                {
  271.                state=STABLE;
  272.                cmt_level++;
  273.                continue;
  274.                }
  275.             else if (!cmt_level)
  276.                {
  277.                ungetc(c,fp_source);
  278.                return '/';
  279.                }
  280.             else if (c != '/')
  281.                state=STABLE;
  282.             break;
  283.  
  284.          case OUT_CMT_STAR:
  285.             if (c=='/')
  286.                {
  287.                cmt_level--;
  288.                state=STABLE;
  289.                continue;
  290.                }
  291.             else if (!cmt_level)
  292.                {
  293.                ungetc(c,fp_source);
  294.                return '*';
  295.                }
  296.             else if (c!='*')
  297.                state=STABLE;
  298.             break;
  299.          }
  300.       if (state==STABLE && !cmt_level)
  301.          return c;
  302.       }
  303. }
  304.